#include "GameManager.h"

GameManager::GameManager():txtmngr_(new TextManager()),j_(new Joueur(txtmngr_)),g_(j_,txtmngr_)
{

    g_.add_vertex(vertex(0,0));
    levelCourant_=g_.getLevel(vertex(0,0));
    v_courant_=vertex(0,0);
    levelCourant_->moveJoueurSpawn();



}

GameManager::~GameManager()
{
    //dtor
}
//Gère le jeu
void GameManager::Start(){

    start_color();
    init_pair(1,COLOR_RED,COLOR_BLACK);
    init_pair(2,COLOR_GREEN,COLOR_BLACK);
    levelCourant_->draw();
    j_->afficheInfoJoueur();
    txtmngr_->displayMessage();
    refresh();
    do{    //Tant que l'on n'a pas tapé "quit" le jeu ne s'arrête pas


        gestionEventG();
        levelCourant_->draw();
        j_->afficheInfoJoueur();
        txtmngr_->displayMessage();


    }while(lastcommand_!="quit");

}
void GameManager::setPerso(int p)
{
    if(p==0)
        j_->creerJedi();
    else
        j_->creerCombattant();

}
void GameManager::levelChangeManager()
{
    if(levelCourant_->getChangeLevel()){
        Type_Edge t=levelCourant_->getTypeChange();
        vertex v=g_.getVertex(v_courant_,t);
        if(!(v.existe())){
            gestionCreationVertex(t);
        }
        v_courant_=g_.getVertex(v_courant_,t);
        levelCourant_=g_.getLevel(v_courant_);

        levelCourant_->changedLevel(t);
        txtmngr_->addMessage("Changement de niveau " + TextManager::to_string(v_courant_.niveau_) +" ID:"+TextManager::to_string(v_courant_.id_));
        if(v_courant_.niveau_==1){
            g_.exportGraphML();
            exit(EXIT_SUCCESS);
        }
    }

}
void GameManager::gestionCreationVertex(Type_Edge t)
{
    vertex v=g_.searchPossibleVertex(v_courant_,t);  //On cherche toutes les noeuds ouverts à une connexion du même type
    if(v.existe() &&(rand()%10<3)   )
        g_.add_edge(v_courant_,v,t);    //Si il en exite on se connecte
    else
        g_.creerVertex(v_courant_,t);   //Sinon on créer un noeud

}
void GameManager::gestionEventG()
{

    int ev=evt.event();
    if(ev==6){
            if(j_->getArme()->getTirTour() !=0){
                levelCourant_->draw();
                Affichage::affiche("Tir déclenché : Entrez une direction");
                int a=evt.event();
                if(a>=0 && a<=3)
                    levelCourant_->gestionAttaqueDistJoueur(convertIntToDirection(a));
                else
                    Affichage::affiche("Direction non valide");
            }else{
                Affichage::affiche("Vous n'avez pas d'arme à distance ( "+j_->getArme()->getNom()+" )");
            }
            refresh();
     }else if(ev==-2)
        menuQuitter();
    else
        levelCourant_->movePerso(ev);


    levelChangeManager();
    levelCourant_->draw();
    levelCourant_->iaNonJoueur();

}
void GameManager::menuQuitter()
{
    ITEM** items_menu; // items du menu pour ncurses doubel pointeur je comprend pas vraiment pourquoi
    MENU* menu;         //Le menu en lui même
    int c,retour; //Caratre entrée dans la boucle / retour de le l'item selectionné
    Evenement::init();
    char *choix[3] = {
                        "Retour au jeu",
                        "Quitter",
                  };        //Les items du menu pour les êtres humains ( la taille doit être nombre d'item plus un pour des raisons que je comprend pas non plus)

    unsigned int n=sizeof(choix)/sizeof(choix[0]); //Nombre d'item
    items_menu=(ITEM**)calloc(n+1,sizeof(ITEM*));
    int taille[4]={n+2,20,0,0};     //Tableau qui ccontien la taille et la position de la sous fenêtre qui contient le menu
    taille[2]=(NY-taille[0])/2;     //On initialise la fneetre pour qu'elle soit au mileu (car ncurses place la fenetre par rapport au point haut gauche
    taille[3]=(NX-taille[1])/2;
    WINDOW * win = newwin(taille[0], taille[1] ,taille[2] , taille[3]);  //Creation de la sous fenetre
    for(int i=0;i<n;i++)
        items_menu[i]=new_item(choix[i],NULL);    //On associe les items du menu version humain au item menu version ncurses
    items_menu[n]=NULL;         //Le n ième est null ( je comprend pas pourquoi
    box(win, 0, 0);   //Pour dessiner le contour de la sous fenetre
    menu=new_menu(items_menu);   //On crée le menu à partir des items
    set_menu_win(menu, win);   //On associe le menu à la sous fenetre
    set_menu_sub(menu,derwin(win, taille[0]-1, taille[1]-1, 1, 1));   //BULLSHIT
    post_menu(menu);  //On affiche le menu
    wrefresh(win);  //Et on rafraichi la sous fenetre

    keypad(stdscr, TRUE);
    while((c = getch())!= ' ' )
	{

	    if(c==Evenement::getBas())    //On monte ou on descend
            menu_driver(menu, REQ_DOWN_ITEM);
        else if(c==Evenement::getHaut())
            menu_driver(menu, REQ_UP_ITEM);

		wrefresh(win);    //On rafraichi la sous fenetre
	}
    keypad(stdscr, FALSE);
    Affichage::effaceTout();      //On efface tout l'écran
    if(item_index(current_item(menu))==1)   //Si on est sur "Quitter" on quitte ...
        exit(0);
    unpost_menu(menu );  //On libère la mémoire
	for(int i=0;i<n+1;i++)
        free_item(items_menu[i]);
	free_menu(menu);
	wrefresh(win);

}
